const { randomUUID } = require('crypto');

/**
 * 生成 32 位 UUID（去掉连字符的 UUID v4）
 * @returns {string} 32 位 UUID
 */
function generateUUID() {
  return randomUUID().replace(/-/g, '');
}

/**
 * 格式化时间为 ISO 字符串或自定义格式
 * @param {Date} [date=new Date()] - 要格式化的日期
 * @param {string} [format='iso'] - 格式（'iso' 或 'custom'）
 * @returns {string} 格式化后的时间字符串
 */
function formatTime(date = new Date(), format = 'iso') {
  if (format === 'iso') {
    return date.toISOString();
  }
  // 自定义格式：YYYY-MM-DD HH:mm:ss
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  const hours = String(date.getHours()).padStart(2, '0');
  const minutes = String(date.getMinutes()).padStart(2, '0');
  const seconds = String(date.getSeconds()).padStart(2, '0');
  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}

/**
 * 验证消息内容是否合法
 * @param {string} content - 消息内容
 * @param {string} type - 消息类型（text, image, file 等）
 * @returns {boolean} 是否合法
 */
function validateMessage(content, type = 'text') {
  if (!content || typeof content !== 'string') return false;
  if (type === 'text') {
    // 文本消息：限制长度（例如 2000 字符）并检查是否为空
    return content.trim().length > 0 && content.length <= 2000;
  }
  if (type === 'image' || type === 'file') {
    // 图片或文件：验证 URL 或路径格式（简单示例）
    return /^https?:\/\/|^file:\/\//.test(content) || content.length <= 500;
  }
  return false;
}

/**
 * 封装消息对象
 * @param {string} senderId - 发送者 ID
 * @param {string} receiverId - 接收者 ID
 * @param {string} content - 消息内容
 * @param {string} [type='text'] - 消息类型
 * @returns {Object|null} 消息对象或 null（如果验证失败）
 */
function createMessage(senderId, receiverId, content, type = 'text') {
  if (!senderId || !receiverId || !validateMessage(content, type)) {
    return null;
  }
  return {
    messageId: generateUUID(),
    senderId,
    receiverId,
    content,
    type,
    timestamp: formatTime(),
    status: 'sent'
  };
}

/**
 * 安全转义消息内容，防止 XSS
 * @param {string} content - 消息内容
 * @returns {string} 转义后的内容
 */
function escapeContent(content) {
  return content
    .replace(/&/g, '&amp;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;')
    .replace(/'/g, '&#39;');
}


/**
 * 格式化时间戳
 * @param {number} timestamp - 时间戳（毫秒）
 * @returns {string} 格式化后的时间字符串
 */
function formatTimestamp(timestamp) {
  const date = new Date(timestamp);
  const now = new Date();
  const isSameDay = (d1, d2) =>
    d1.getFullYear() === d2.getFullYear() &&
    d1.getMonth() === d2.getMonth() &&
    d1.getDate() === d2.getDate();

  // 补零函数
  const padZero = (num) => String(num).padStart(2, '0');

  // 获取小时和分钟
  const hours = padZero(date.getHours());
  const minutes = padZero(date.getMinutes());

  // 判断是否是今天
  if (isSameDay(date, now)) {
    return `${hours}:${minutes}`;
  }

  // 判断是否是昨天
  const yesterday = new Date(now);
  yesterday.setDate(now.getDate() - 1);
  if (isSameDay(date, yesterday)) {
    return `昨天 ${hours}:${minutes}`;
  }

  // 其他日期返回 MM/dd
  const month = padZero(date.getMonth() + 1); // 月份从 0 开始，需加 1
  const day = padZero(date.getDate());
  return `${month}/${day}`;
}


export {
  generateUUID,
  formatTime,
  validateMessage,
  createMessage,
  escapeContent,
  formatTimestamp
}
